package com.lqq.designPattern.bulider_pattern.singleton.demo4;
/**
 * 双重检测锁方式 懒汉式
 * */
public class Singleton {
    //构造器私有
    private Singleton() {}
    //声明Singleton类型的变量
    //private static Singleton instance;在多线程情况下，会存在指令重排，需加关键字volatile
    private static volatile Singleton instance;
    //提供一个公共的访问方式，让外界获取该对象
    public static Singleton getInstance() {
        //第一次判断，如果instance不为空，直接返回实例，不需要抢占锁
        if (instance == null) {
            synchronized (Singleton.class) {//锁住类
                //第二次判断
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

    /**
     * 反射破解单例模式需要添加的代码
     */
//    //构造器私有
//    //声明Singleton类型的变量
//    //private static Singleton instance;在多线程情况下，会存在指令重排，需加关键字volatile
//    private static volatile Singleton instance;
//
//    private Singleton() {
//        if (instance != null) {
//            throw new RuntimeException("不能创建多个对象!");
//        }
//    }
//    //提供一个公共的访问方式，让外界获取该对象
//    public static Singleton getInstance() {
//        //第一次判断，如果instance不为空，直接返回实例，不需要抢占锁
//        if (instance == null) {
//            synchronized (Singleton.class) {//锁住类
//                //第二次判断
//                if (instance == null) {
//                    instance = new Singleton();
//                }
//            }
//        }
//        return instance;
//    }

}
